/**
 * 
 */
package cn.dgfy.MyBatisStudy.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import cn.dgfy.MyBatisStudy.bean.Student;

/**
 * @author Tearfalls
 *
 */
public interface StudentMapper {
	/* MyBatis允许为增、删、改方法定义以下类型的返回值:
	 * 		Boolean, boolean：如果增删改操作影响的行数大于0，则返回Boolean.TRUE、true，否则返回Boolean.FALSE、false
	 * 		Integer, int, Long, long：返回增删改操作所影响的行数
	 * 此返回值类型定义不需要体现在SQL映射配置中，只要在接口方法中定义就可以直接使用
	 */
	public boolean add(Student student);
	
	public int removeById(Integer id);
	
	public long modify(Student student);
	
	/*
	 * 查询所有学生的信息，使用PageHelper进行分页查询
	 */
	public List<Student> get();
	
	public Student getById(Integer id);
	
	/*
	 * 对于多参数的接口方法，MyBatis会做特殊处理，具体信息参见本接口对应的SQL映射文件，此处只是演示如果实现命名参数
	 * 使用@Param("KEY")注解为每个参数指定其在MyBatis封装的参数Map中的键值，其中”KEY“即为要指定的键值
	 */
	public Student getByIdOrUsername(@Param("id") Integer id, @Param("username") String username);
	
	/*
	 * 如果需要传递多个参数而不不想使用注解的方式，则可以自己封装一个参数Map的方式来实现命名参数传递
	 * 此处对接口方法定义方式做简单演示，SQL映射定义方式参见SQL映射定义文件中相应SQL定义语句
	 * 本接口方法的调用方式如下：
	 * 	Map<String, Object> params = new HashMap<>(2);
	 * 	params.put("id", 1);
	 * 	params.put("username", "admin");
	 * 	Student student = mapper.getByIdOrUsernameWithMap(params);
	 */
	public Student getByIdOrUsernameWithMap(Map<String, Object> params);
	
	/**
	 * 以模糊查询的方式根据真实姓名查询学生记录
	 * @param realName 要做为查询依据的真实姓名，可以使用通配符
	 * @return 包含查询结果的集合
	 */
	public List<Student> getByRealNameLike(String realName);
	
	/**
	 * 以指定的专业id为依据查询所有专业为指定专业的学生记录
	 * @param majorId 用于查询依据的专业id
	 * @return 包含查询结果的列表
	 */
	public List<Student> getByMajorId(Integer majorId);
	
	/**
	 * 以id为依据查询单条记录，其中的项以列名为键，以列值为值
	 * @param id 要用于查询的id值
	 * @return 将单条结果记录封装成的Map
	 */
	public Map<String, Object> getByIdReturnMap(Integer id);
	
	/**
	 * 以模糊查询的方式根据真实姓名查询学生记录，并将多个结果记录封装为Map<Integer, Student>对象，键是对应记录的主键，值为记录封装后的JavaBean对象
	 * @param realName 要做为查询依据的真实姓名，可以使用通配符
	 * @return 封装有结果记录的Map对象
	 */
	/*
	 * @MapKey：设定MyBatis在封装结果Map时使用封装好的实体对象的哪个字段值作为Map的键值
	 */
	@MapKey("id")
	public Map<Integer, Student> getByRealNameLikeReturnMap(String realName);
	
	/*
	 * 以联合查询SQL语句查询出Student的所有信息（包括相关联的专业信息）并一次性封装于Student对象
	 */
	public Student getByIdJointQuery1(Integer id);
	
	/*
	 * 以联合查询SQL语句查询出Student的所有信息（包括相关联的专业信息）并一次性封装于Student对象
	 */
	public Student getByIdJointQuery2(Integer id);
	
	/*
	 * 以分步查询的方式查询出Student的所有信息（不包括相关联的专业信息），而后再查询出对应专业的相关信息，而后再组合封装为完整的Student对象
	 */
	public Student getByIdStepQuery(Integer id);
	
	/*
	 * 鉴别器使用示例，如果查出的学生为男生，则加载其真实姓名并不加载其专业信息；如果为女生，则不加载其真实姓名，但加载其专业信息
	 */
	public Student getByIdDecideBySex(Integer id);
}
